package com.rw.coco.handler;

import com.rw.coco.api.data.CocoDataApi;
import com.rw.coco.api.event.MessageEvent;
import com.rw.coco.handler.message.event.CocoMessageEvent;
import com.rw.coco.handler.message.reply.ReplyHandler;
import com.rw.coco.handler.message.reply.handler.validate.BotSwitchFilter;
import com.rw.coco.handler.message.reply.handler.validate.DismissReplyHandler;
import com.rw.coco.handler.message.reply.handler.validate.GroupFrequencyHandler;
import com.rw.coco.handler.message.reply.handler.validate.PrivateFrequencyHandler;
import com.rw.coco.handler.message.reply.handler.validate.SwitchOnOFFReplyHandler;
import com.rw.coco.handler.message.reply.util.DiceHandlerListUtil;
import com.rw.coco.handler.message.reply.util.NormalHandlerUtil;

import java.util.ArrayList;
import java.util.List;
/*
    TODO
    0. 去除指令前缀（mysql）
    1. 接受退群、删除好友指令
    2. 接受骰娘大开关开启、关闭指令
    3. 判断骰娘大开关是否开启
    4. 检验黑名单（mysql，redis）
    5. 接受开启、关闭骰娘指令
    6. 判断骰娘群开关是否开启
    7. 接受普通指令
    8. 指令如果接受成功，检验频率（mysql，redis）
*/

/**
 * 消息触发器
 */
public class MessageHandler {
    // api
    private final CocoDataApi dataApi;

    // 校验Handler列表
    private final List<ReplyHandler> validateHandlerList;

    // 骰娘指令Handler列表
    private final List<ReplyHandler> diceHandlerList;

    // 普通聊天Handler列表
    private final List<ReplyHandler> normalHandlerList;

    // 频率Handler列表
    private final List<ReplyHandler> frequencyHandlerList;

    public MessageHandler(CocoDataApi dataApi) {
        this.dataApi = dataApi;

        // 配置校验列表
        validateHandlerList = new ArrayList<>();
        // 退群、删好友指令
        validateHandlerList.add(new DismissReplyHandler());
        // 机器人总开关指令
        validateHandlerList.add(new SwitchOnOFFReplyHandler());
        // 机器人开关拦截
        validateHandlerList.add(new BotSwitchFilter());

        // 配置骰娘指令列表
        diceHandlerList = DiceHandlerListUtil.get();

        // 配置普通聊天列表
        normalHandlerList = NormalHandlerUtil.get();

        // 配置频率列表
        frequencyHandlerList = new ArrayList<>();
        frequencyHandlerList.add(new GroupFrequencyHandler());
        frequencyHandlerList.add(new PrivateFrequencyHandler());
    }

    // 获取基本信息
    public void handle(MessageEvent messageEvent) {
        CocoMessageEvent cocoMessageEvent = CocoMessageEvent.of(messageEvent, dataApi);

        // 执行前置校验
        if (executeReplyHandler(validateHandlerList, cocoMessageEvent)) {
            return;
        }

        if (cocoMessageEvent.hasPrefix()) {
            // 如果消息有前缀，则执行骰娘指令
            if (executeReplyHandler(diceHandlerList, cocoMessageEvent)) {
                // 频率校验
                executeFrequencyHandler(cocoMessageEvent);
                return;
            }
        } else {
            // 如果消息没有前缀，则执行普通聊天
            if (executeReplyHandler(normalHandlerList, cocoMessageEvent)) {
                // 频率校验
                executeFrequencyHandler(cocoMessageEvent);
                return;
            }
        }

        // TODO 上生产环境需要删除
        cocoMessageEvent.getCocoLogger().info("运行结束，未执行任何回复。");
    }

    /**
     * 执行ReplyHandler列表
     * 若执行成功，则返回true
     * 若执行失败，则返回false
     */
    private boolean executeReplyHandler(List<ReplyHandler> replyHandlerList, CocoMessageEvent event) {
        for (ReplyHandler replyHandler : replyHandlerList) {
            if (replyHandler.trigger(event)) {
                replyHandler.handler(event);
                return true;
            }
        }
        return false;
    }

    /**
     * 执行频率限制
     */
    private void executeFrequencyHandler(CocoMessageEvent event) {
        for (ReplyHandler replyHandler : frequencyHandlerList) {
            if (replyHandler.trigger(event)) {
                replyHandler.handler(event);
            }
        }
    }
}
